package co.edu.udea.herbario.dao.impl;

import co.edu.udea.herbario.dao.Conexion;
import co.edu.udea.herbario.dao.GeneroDao;
import co.edu.udea.herbario.dto.Familia;
import co.edu.udea.herbario.dto.Genero;
import co.edu.udea.herbario.exception.OrgSistemasDaoException;
import co.edu.udea.herbario.util.ConstantesStatic;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

/**
 *Esta clase contiene la implementación de los métodos planteados en la interface 
 * GeneroDao,los cuales son utilizados para gestionar los datos de persistencia
 * asociados a los generos registrados en el sistema 
 *
 * @author Lorena Orozco
 */
public class GeneroDaoImp implements GeneroDao
{
    ResourceBundle consultasSQL;    //variable para obtener las consultas sql
    Connection con = null;          //variable para la conexion a la BD
    CallableStatement cs = null;    //variable para el llamado a las funciones de la BD
    ResultSet rs = null;            //variable para obtener el resultado de la consulta sql

    public GeneroDaoImp()
    {
        consultasSQL = ResourceBundle.getBundle(ConstantesStatic.PROPERTIES_CONSULTAS);
        con = Conexion.obtenerInstancia().abrirConexion();
    }

    public Genero obtenerGenero(int codigo)
    {
        Genero gene = new Genero();      

        try
        {
            String consulta = consultasSQL.getString("obtenerGenero");
            boolean retorno = false;
            
            cs = con.prepareCall(consulta);

            if(codigo > 0)
            {
                cs.setInt(1, codigo);
            }
            else
            {
                return gene;
            }

            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    Familia fami = new Familia();
                    fami.setCodigo(rs.getInt("codigoFamilia"));
                    fami.setNombre(rs.getString("nombreFamilia"));
                    fami.setFechaIngreso(rs.getDate("fechaIngresoFamilia"));

                    gene.setCodigo(rs.getInt("codigoGenero"));
                    gene.setNombre(rs.getString("nombreGenero"));
                    gene.setFechaIngreso(rs.getDate("fechaIngresoGenero"));
                    gene.setFamilia(fami);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return gene;
    }

    public Genero obtenerGeneroPorNombre(String gene)
    {
        Genero gen = new Genero();

        try
        {
            String consulta = consultasSQL.getString("obtenerGeneroPorNombre");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(gene != null && !"".equals(gene))
            {
                cs.setString(1, gene);
            }
            else
            {
                return gen;
            }

            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    Familia fami = new Familia();
                    fami.setCodigo(rs.getInt("codigoFamilia"));
                    fami.setNombre(rs.getString("nombreFamilia"));
                    fami.setFechaIngreso(rs.getDate("fechaIngresoFamilia"));

                    gen.setCodigo(rs.getInt("codigoGenero"));
                    gen.setNombre(rs.getString("nombreGenero"));
                    gen.setFechaIngreso(rs.getDate("fechaIngresoGenero"));
                    gen.setFamilia(fami);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return gen;
    }

    public List<String> obtenerNombresGeneros(String valor)
    {
        List<String> nombresGeneros = new ArrayList<String>();

        try
        {
            String consulta = consultasSQL.getString("obtenerNombresGeneros");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(valor != null && !"".equals(valor))
            {
                cs.setString(1, valor);
            }
            else
            {
                return nombresGeneros;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    String nombre = rs.getString("NOMBRE");
                    nombresGeneros.add(nombre);
                }
            }            

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }
        
        return nombresGeneros;
    }

    public int crearGenero(Genero genero)
    {
        int res = 1;
        return res;
    }

    public int actualizarGenero(Genero genero)
    {
        int res = 1;
        return res;
    }
}
